#!/usr/bin/env python
# -*- coding: UTF-8 -*-


'''
    Connection:
        主要职责是记录连接的权重，以及这个连接所关联的上下游节点
'''
import random

class Connection(object):
    def __init__(self, up_stream_node, down_stream_node):
        '''
        初始化一个连接
        :param up_stream_node: 连接的上游节点
        :param down_stream_node: 连接的下游节点
        '''
        # 当前连接的上游节点
        self.up_stream_node = up_stream_node
        # 当前连接的下游节点
        self.down_stream_node = down_stream_node
        # 当前连接的权重，初始化为一个很小的随机数，需要学习的参数
        self.weight = random.uniform(-0.1, 0.1)
        # 当前连接的梯度
        self.gradient = 0.0


    def calc_gradient(self):
        '''
        结算梯度
        '''
        self.gradient  = self.down_stream_node.delta * self.up_stream_node.output


    def get_gradient(self):
        ''' 获取当前梯度 '''
        return self.gradient


    def update_weight(self, rate):
        '''
        根据梯度下降法更新权重
        :param rate: 学习率
        :return:
        '''
        # 计算梯度
        self.calc_gradient()
        self.weight += rate * self.gradient


    def __str__(self):
        '''
        打印连接信息
        :return:
        '''
        return '(%u-%u) -> (%u-%u) = %f' % (
            self.up_stream_node.layer_index,
            self.up_stream_node.node_index,
            self.down_stream_node.layer_index,
            self.down_stream_node.node_index,
            self.weight)